package com.zl.util;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

/**
 * 异常信息打印到log日志中
 */
public class Exceptions {
    /**
     * 短时间内大量请求访问此接口 -> 代码本身有问题，很多情况下抛异常
     * -> e.printStackTrace() 来打印异常到控制台
     * -> 产生错误堆栈字符串到字符串池内存空间
     * -> 此内存空间一下子被占满了
     * -> 开始在此内存空间产出字符串的线程还没完全生产完整，就没空间了
     * ->  大量线程产出字符串产出到一半，等在这儿（等有内存了继续搞啊）
     * -> 相互等待，等内存，锁死了，整个应用挂掉了
     * <p>
     * <p>
     * 一个应对办法就是捕获e.printStrackTrace()输出，
     * 使用e.printStackTrace(PrintStream)方法，
     * 将异常栈信息先输出到ByteOutputStream ，
     * 然后再将ByteOutputStream 转换为字符串，就获得了异常的完整输出。
     *
     * @param e
     * @return
     */
    public static String getStackTraceAsString(Throwable e) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        e.printStackTrace(new PrintStream(baos));
        return baos.toString();
    }
}
